package com.adee.java;

import java.util.*;


public class Test010_ListAndSet {
    public static void main(String[] args) {
        // test1();
        test2();
    }

    /*
     * List和Set的区别
     * List: 有序，按对象进入的顺序保存对象，可重复，允许多个null元素对象，可使用Iterator取出所有元素，还可使用get(int index)随机访问元素；
     * Set: 无序，不可重复，最多允许一个null元素对象，重复添加不会报错，只可通过Iterator接口取出元素，不可随机访问。
     * */
    public static void test1() {
        List<String> list = new ArrayList();
        list.add("hello");
        list.add("world");
        list.add("Jack");
        list.add(null);
        list.add("Rose");
        list.add("House");
        list.add(null);
        list.add("Cause");
        list.add(null);
        Iterator<String> iterator = list.iterator();
        while (iterator.hasNext()) {
            String e = iterator.next();
            if(e != null && e.contains("d")) iterator.remove();
        }
        System.out.println(list.toString()); // [hello, Jack, null, Rose, House, null, Cause, null]

        Set<String> set = new HashSet<>();
        set.add("hello");
        set.add("hello");
        set.add("Jack");
        set.add(null);
        set.add("world");
        set.add("Lily");
        set.add(null);
        System.out.println(set.toString()); // [null, world, hello, Jack, Lily]
        Iterator<String> iterator1 = set.iterator();
        while (iterator1.hasNext()) {
            String e = iterator1.next();
            if(e != null && e.contains("o")) iterator1.remove();
        }
        System.out.println(set.toString()); // [null, Jack, Lily]
    }

    /*
     * ArrayList和LinkedList
     * 默认都是从尾部add，头部remove；
     * 1. 底层数据结构，ArrayList数组，LinkedList链表；
     * 2. ArrayList适合查找操作多的场景，LinkedList适合增删多的场景；
     * 3. 二者都实现了List接口，但LinkedList实现了Deque接口，可以作为队列和栈使用。
     * */
    public static void test2() {
        List<String> list = new ArrayList<>();
        LinkedList<String> list1 = new LinkedList<>();
        // LinkedList当作栈用
        list1.push("hello");
        list1.push("world");
        list1.push("Jack");
        System.out.println(list1.pop()); // Jack
        System.out.println(list1.pop()); // world
        System.out.println(list1.pop()); // hello
        // LinkedList当作队列使用
        Deque<String> dq = list1;
        dq.addFirst("z3");
        dq.addFirst("li4");
        dq.addFirst("w5");
        System.out.println(dq.removeLast()); // z3
        System.out.println(dq.removeLast()); // li4
        System.out.println(dq.removeLast()); // w5
    }
}
